﻿using System;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
using System.IO.Ports;
using System.Threading;
using System.Windows.Forms;
using System.Timers;
using GPSMap.Testing;
using HTMapLib;
using HTMapLib.Classes;
using MapControl;
using MapControl.Misc;
using MapControl.Misc.DAL;
using MapControl.Misc.GPSPoint;
using MapXLib;
using Point = System.Drawing.Point;

namespace GPSMap
{
    public partial class frmGPSTracking_Testing : Form
    {
        private frmGPSInfo_Testing frmInfo;

        //private ImageList imgList = new ImageList();

        //private ComPort GeneralClass.objPort;
        public ucVectShapeMap mapControl;
        private ucToolStrip objToolStripControl;

        private Coordinate9x9 _coord9x9;

        private ucGPSData gpsDataControl;

        public bool isShowGPSData = true;
        public bool isShowRoute = true;
        private AirPortRepository _airPortRespository;
        public frmGPSTracking_Testing()
        {
            InitializeComponent();
            
            
            _airPortRespository = new AirPortRepository(GeneralClass.appDBFile);
            //Khởi tạo COM port
            GeneralClass.objPort = new ComPort(Properties.Settings.Default.PortName, Properties.Settings.Default.BaudRate, Properties.Settings.Default.StopBits, Properties.Settings.Default.DataBits, Properties.Settings.Default.Parity, true);
            GeneralClass.objPort.comPort_DataReceivedEvent += new SerialDataReceivedEventHandler(comPort_DataReceived);


            //Load Map user control           
            mapControl = new ucVectShapeMap(true);
            mapControl.Dock = DockStyle.Fill;
            
            //Load Map user control           
            mapControl.ucMap1.AxMap_MouseDownEvent += new AxMapXLib.CMapXEvents_MouseDownEventHandler(AxMap_MouseDownEvent);
            mapControl.ucMap1.AxMap_MouseMoveEvent += new AxMapXLib.CMapXEvents_MouseMoveEventHandler(AxMap_MouseMoveEvent);
            mapControl.ucMap1.AxMap_MouseUpEvent += new AxMapXLib.CMapXEvents_MouseUpEventHandler(AxMap_MouseUpEvent);
            mapControl.ucMap1.AxMap_DrawUserLayer += new AxMapXLib.CMapXEvents_DrawUserLayerEventHandler(AxMap_DrawUserLayer);
            mapControl.ucMap1.AxMap_MouseWheelEvent += new AxMapXLib.CMapXEvents_MouseWheelEventHandler(AxMap_MouseWheelEvent);
            mapControl.ucMap1.AxMap_MapViewChanged += new System.EventHandler(AxMap_MapViewChangedEvent);
            mapControl.ucMap1.AxMap_DblClick += new System.EventHandler(this.AxMap_DblClick);

            //Load ToolStrip user control
            objToolStripControl = new ucToolStrip(mapControl.ucMap1);
            objToolStripControl.Dock = DockStyle.Top;

            _coord9x9 = new Coordinate9x9();
            string value = Properties.Settings.Default.Coord9x9;
            _coord9x9.BigSquareArray = value.Split(new char[] { '|' });

            this.Controls.Add(objToolStripControl);
            this.Controls.Add(menuStrip1);
            panelMap.Controls.Add(mapControl);
            
        }

        private void frmGPSTracking_Load(object sender, EventArgs e)
        {
            try
            {
                mapControl.ucMap1.InitMap(string.Format(@"{0}\Maps\BanDo.gst", Application.StartupPath), 2187000, 106.9284196519465, 16.07934787370213);
                mapControl.ucMap1.Map.BackColor = Color.Gray;

                frmInfo = new frmGPSInfo_Testing(this);
                frmInfo.TopMost = true;
                //Khởi tạo tọa độ 9x9 đã lưu mặc định
                //string value = Properties.Settings.Default.Coord9x9;
                //_coord9x9.BigSquareArray = value.Split(new char[] { '|' });
                mapControl.ucMap1.Map.Layers["AsiaMap"].Visible = false;
                bảnĐồ2ToolStripMenuItem_Click(null, null);
                hiểnThịTọaĐộBayToolStripMenuItem_Click(null, null);
                hiểnThịQuỹĐạoBayToolStripMenuItem_Click(null, null);
                hiểnThịThôngTinQuỹĐạoToolStripMenuItem_Click(null, null);
                //bảngTheoDõiToolStripMenuItem_Click(null, null);
                xemLạiDữLiệuToolStripMenuItem_Click(null, null);
                //hiểnThịTốiƯuTốcĐộToolStripMenuItem_Click(null, null);
                //Load database;
                InitLoadDatabase();

                GeneralClass.objCurrAirport = _airPortRespository.GetCurrentAirport();
            }
            catch (Exception ex)
            {
                MessageBox.Show(String.Format("{0} {1}", ex.Message, ex.StackTrace));
            }
            
        }

        public void UpdateToolStrip(string message)
        {
            toolStripStatusLabelCOMStatus.Text = message;
        }

        #region COM Port

        /// <summary>
        /// Hiển thị dữ liệu lên bản đồ
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            //if (!isOptimize)
            //{
                if (GeneralClass.dbTestGPS.Rows.Count > 0)
                {
                    GeneralClass.currGPSData = new GPSCurrentPoint(GeneralClass.dbTestGPS.Rows[GeneralClass.dbTestGPS.Rows.Count - 1]);
                    mapControl.Refresh();
                }
            //}
            //else
            //{
            //    Graphics g = mapControl.ucMap1.Map.CreateGraphics();
            //    foreach (BaseGPSPoint gps in GeneralClass.objPort.gpsPointList)
            //    {
            //        if (lastPoint != null)
            //            lastPoint.Draw(g, Color.Blue);

            //        //Nếu là hiển thị lộ trình thì tiếp tục vẽ thêm line
            //        if (isShowRoute)
            //        {
            //            //Nếu có lastPoint thì vẽ line
            //            if (lastPoint != null)
            //                gps.DrawRoute(g, lastPoint);
            //        }

            //        //Nếu là hiển thị tọa độ thì tiếp tục vẽ thêm node không cần refresh
            //        if (isShowGPSData)
            //        {
            //            gps.Draw(g, Color.Blue);
            //        }

            //        //Vẽ tọa độ hiện hành
            //        if (GeneralClass.currGPSData != null)
            //        {
            //            GeneralClass.currGPSData.Draw(g, Color.Red);
            //            //Lưu lại tọa độ last sau khi vẽ xong
            //            lastPoint = GeneralClass.currGPSData;
            //        }
            //    }
            //}
        }

        #endregion

        #region AxMap

        
        public void AxMap_DrawUserLayer(object sender, AxMapXLib.CMapXEvents_DrawUserLayerEvent e)
        {
            //IntPtr hdc = new IntPtr(e.hOutputDC);
            Graphics g = Graphics.FromHdc(new IntPtr(e.hOutputDC));
            //Graphics g = mapControl.ucMap1.Map.CreateGraphics();
            g.SmoothingMode = SmoothingMode.AntiAlias;

            //Nếu độ cao < 10.000 km thì vẽ các tọa độ
            if (mapControl.ucMap1.Altitude < 10000)
            {
                //Nếu chọn hiển thị tọa độ và hiển thị lộ trình
                if (isShowGPSData || isShowRoute)
                {
                    if (GeneralClass.dbTestGPS.Rows.Count > 0)
                    {
                        BaseGPSPoint lastGPSPoint = new GPSNormalPoint(GeneralClass.dbTestGPS.Rows[0]);
                        ////Chỉ vẽ lại 10000 tọa độ mới nhất
                        //if (GeneralClass.dbTestGPS.Rows.Count > 5000)
                        //{

                        //}

                        //foreach (DataRow dr in GeneralClass.dbTestGPS.Rows)
                        //{
                        //    BaseGPSPoint gpsPoint = new GPSNormalPoint(dr);
                        //    //pointList.Add(gpsPoint.CenterPoint);

                        //    //Nếu vẽ tọa độ
                        //    if (isShowGPSData)
                        //    {
                        //        //Bỏ qua nếu là tọa độ hiện hành (tọa độ đang chọn hoặc tọa độ mới nhất)
                        //        if (!gpsPoint.Equals(GeneralClass.currGPSData))
                        //        {
                        //            //Tính lại tọa độ tâm center để vẽ object
                        //            float centerX, centerY;
                        //            centerX = centerY = 0;
                        //            mapControl.ucMap1.Map.ConvertCoord(ref centerX, ref centerY, ref gpsPoint.objGPSData.LonGPS, ref gpsPoint.objGPSData.LatGPS, MapXLib.ConversionConstants.miMapToScreen);
                        //            gpsPoint.CenterPoint = new PointF(centerX, centerY);
                        //            gpsPoint.Draw(g);
                        //        }
                        //        else
                        //        {
                        //            //Tính lại tọa độ tâm center để vẽ object
                        //            float centerX, centerY;
                        //            centerX = centerY = 0;
                        //            mapControl.ucMap1.Map.ConvertCoord(ref centerX, ref centerY, ref GeneralClass.currGPSData.objGPSData.LonGPS, ref GeneralClass.currGPSData.objGPSData.LatGPS, MapXLib.ConversionConstants.miMapToScreen);
                        //            GeneralClass.currGPSData.CenterPoint = new PointF(centerX, centerY);
                        //            GeneralClass.currGPSData.Draw(g);
                        //        }
                                    
                        //    }

                        //    //Nếu vẽ lộ trình
                        //    if (isShowRoute)
                        //    {
                        //        if (GeneralClass.currGPSData != null)
                        //        {
                        //            //Tính lại tọa độ tâm center để vẽ object
                        //            float centerX, centerY;
                        //            centerX = centerY = 0;
                        //            mapControl.ucMap1.Map.ConvertCoord(ref centerX, ref centerY, ref GeneralClass.currGPSData.objGPSData.LonGPS, ref GeneralClass.currGPSData.objGPSData.LatGPS, MapXLib.ConversionConstants.miMapToScreen);
                        //            GeneralClass.currGPSData.CenterPoint = new PointF(centerX, centerY);
                        //            GeneralClass.currGPSData.Draw(g);
                        //        }
                                    

                        //        //Nếu distance nhỏ hơn 50 km thì mới vẽ lộ trình
                        //        if (MapHelper.CalculateDistance(mapControl.ucMap1.Map, gpsPoint.objGPSData.LonGPS, gpsPoint.objGPSData.LatGPS, lastGPSPoint.objGPSData.LonGPS, lastGPSPoint.objGPSData.LatGPS) < 50)
                        //        {
                        //            //Tính lại tọa độ tâm center của pointFrom
                        //            float centerX, centerY;
                        //            centerX = centerY = 0;
                        //            mapControl.ucMap1.Map.ConvertCoord(ref centerX, ref centerY, ref gpsPoint.objGPSData.LonGPS, ref gpsPoint.objGPSData.LatGPS, MapXLib.ConversionConstants.miMapToScreen);
                        //            gpsPoint.CenterPoint = new PointF(centerX, centerY);

                        //            //Tính lại tọa độ tâm center của pointTo
                        //            centerX = centerY = 0;
                        //            mapControl.ucMap1.Map.ConvertCoord(ref centerX, ref centerY, ref lastGPSPoint.objGPSData.LonGPS, ref lastGPSPoint.objGPSData.LatGPS, MapXLib.ConversionConstants.miMapToScreen);
                        //            lastGPSPoint.CenterPoint = new PointF(centerX, centerY);
                        //            gpsPoint.DrawRoute(g, lastGPSPoint);
                        //        }
                                    
                        //    }
                        //    //Lưu lại tọa độ gần nhất
                        //    lastGPSPoint = gpsPoint;
                        //}

                    }
                }
                else //Chỉ vẽ tọa độ hiện hành
                {
                    if (GeneralClass.currGPSData != null)
                    {
                        //Tính lại tọa độ tâm center để vẽ object
                        float centerX, centerY;
                        centerX = centerY = 0;
                        mapControl.ucMap1.Map.ConvertCoord(ref centerX, ref centerY, ref GeneralClass.currGPSData.objGPSData.LonGPS, ref GeneralClass.currGPSData.objGPSData.LatGPS, MapXLib.ConversionConstants.miMapToScreen);
                        GeneralClass.currGPSData.CenterPoint = new PointF(centerX, centerY);
                        GeneralClass.currGPSData.Draw(g);
                    }
                        
                }

                //Nếu là hiển thị vị trí Sân bay đang chọn
                if (GeneralClass.IsViewAirport)
                {
                    BaseGPSPoint objAirport = new GPSAirportPoint(GeneralClass.objCurrAirport.Airport_Name, GeneralClass.objCurrAirport.Longitude, GeneralClass.objCurrAirport.Latitude,0,0,0, DateTime.Now.Date, 0);
                    //Tính lại tọa độ tâm center để vẽ object
                    float centerX, centerY;
                    centerX = centerY = 0;
                    mapControl.ucMap1.Map.ConvertCoord(ref centerX, ref centerY, ref objAirport.objGPSData.LonGPS, ref objAirport.objGPSData.LatGPS, MapXLib.ConversionConstants.miMapToScreen);
                    objAirport.CenterPoint = new PointF(centerX, centerY);
                    objAirport.Draw(g, Color.Red);
                    
                    ////Draw Airport
                    //float r = 0.05f;
                    //float x1, y1, x2, y2;
                    //x1 = y1 = x2 = y2 = 0;
                    //double lon1, lat1, lon2, lat2;
                    //lon1 = GeneralClass.objCurrAirport.Longitude - r;
                    //lat1 = GeneralClass.objCurrAirport.Latitude + r;
                    //lon2 = GeneralClass.objCurrAirport.Longitude + r;
                    //lat2 = GeneralClass.objCurrAirport.Latitude - r;

                    //mapControl.ucMap1.Map.ConvertCoord(ref x1, ref y1, ref lon1, ref lat1, MapXLib.ConversionConstants.miMapToScreen);
                    //mapControl.ucMap1.Map.ConvertCoord(ref x2, ref y2, ref lon2, ref lat2, MapXLib.ConversionConstants.miMapToScreen);

                    //Pen pen = new Pen(Color.Red, 2);
                    //g.DrawEllipse(pen, new RectangleF(x1, y1, Math.Abs(x2 - x1), Math.Abs(y2 - y1)));

                    //pen.Dispose();
                }

                //==================================================
                //9x9 coordinate
                float x1, y1, x2, y2;
                x1 = y1 = x2 = y2 = 0;
                //Convert to Screen Coord
                mapControl.ucMap1.Map.ConvertCoord(ref x1, ref y1, ref _coord9x9.NWLon, ref _coord9x9.NWLat, MapXLib.ConversionConstants.miMapToScreen);
                mapControl.ucMap1.Map.ConvertCoord(ref x2, ref y2, ref _coord9x9.SELon, ref _coord9x9.SELat, MapXLib.ConversionConstants.miMapToScreen);
                _coord9x9.Init(x1, y1, x2, y2, mapControl.ucMap1.Altitude);
                if (ShowCoordinate9x9)
                {
                    _coord9x9.Draw(g);
                }
            }
            //else
            //{
            //    MessageBox.Show("Chỉ hiện ký hiệu lên bản đồ khi độ cao < 10.000 km");
            //}

            g.Dispose();
        }

        public void AxMap_MouseDownEvent(object sender, AxMapXLib.CMapXEvents_MouseDownEvent e)
        {
            if (e.button == 1)
            {

                PointF pScreen = new PointF(e.x, e.y);

                //Graphics g = mapControl.ucMap1.Map.CreateGraphics();
                //g.SmoothingMode = SmoothingMode.AntiAlias;
                //Pen p = new Pen(Color.Green, 2);
                //g.DrawRectangle(p, new Rectangle((int)firstPoint.X, (int)firstPoint.Y, 50, 50));

                //Nếu hiển thị thông tin tọa độ
                if (isShowGPSInfo)
                {
                    for (int i = 0; i < GeneralClass.dbTestGPS.Rows.Count; i++)
                    {
                        BaseGPSPoint objGPS = new GPSNormalPoint(GeneralClass.dbTestGPS.Rows[i]);
                        //Nếu click trúng vào vị trí GPS thì hiển thị form
                        if (objGPS.HitTest(pScreen) == 0 &&
                            mapControl.ucMap1.Map.CurrentTool == MapXLib.ToolConstants.miArrowTool)
                        {
                            ShowGPSInfo(true);
                            frmInfo.ShowInfo(objGPS);
                            break;
                        }
                    }
                }
            }
        }

        public void AxMap_MouseMoveEvent(object sender, AxMapXLib.CMapXEvents_MouseMoveEvent e)
        {

            UpdateStatusStrip(e.x, e.y);
            if (e.button == 1)
            {
                //if (mapControl.ActiveTool == DrawToolType.Distance)
                //{
                //    PointF secondPoint = new PointF(e.x, e.y);
                //    mapControl.ucMap1.Map.Refresh();
                //    Graphics g = mapControl.ucMap1.Map.CreateGraphics();
                //    g.SmoothingMode = SmoothingMode.AntiAlias;
                //    Pen p = new Pen(Color.Green, 2);
                //    g.DrawLine(p, firstPoint, secondPoint);
                //    p.Dispose();
                //    g.Dispose();
                //}
            }
        }

        public void AxMap_MouseUpEvent(object sender, AxMapXLib.CMapXEvents_MouseUpEvent e)
        {
            UpdateStatusStrip(e.x, e.y);
            if (e.button == 1)
            {
                //if (mapControl.ActiveTool == DrawToolType.Distance)
                //{
                //    PointF secondPoint = new PointF(e.x, e.y);
                //    double distance = mapControl.CalculateDistance(firstPoint, secondPoint, ucMap.enumDistance.Kilometer);
                //    MessageBox.Show(string.Format("Khoảng cách là {0} km", distance.ToString("#,##0")));
                //}
            }
        }

        private void AxMap_MouseWheelEvent(object sender, AxMapXLib.CMapXEvents_MouseWheelEvent e)
        {
            UpdateStatusStrip(e.x, e.y);
        }

        private void AxMap_MapViewChangedEvent(object sender, EventArgs e)
        {
            toolStripStatusLabelAltitude.Text = string.Format("Độ cao: {0} km", mapControl.ucMap1.Altitude.ToString("#,##0.##0"));
        }

        private void AxMap_DblClick(object sender, EventArgs e)
        {

        }
        #endregion

        /// <summary>
        /// Hàm khởi tạo load database lần đầu
        /// </summary>
        public void InitLoadDatabase()
        {
            GeneralClass.dbTestGPS = GPSDataRepository.LoadDatabase(0,0);
            //Nếu có dữ liệu thì gán tọa độ hiện hành là tọa độ nhận gần nhất
            if (GeneralClass.dbTestGPS.Rows.Count > 0)
                GeneralClass.currGPSData = new GPSCurrentPoint(GeneralClass.dbTestGPS.Rows[GeneralClass.dbTestGPS.Rows.Count - 1]);
            //Refresh bản đồ để vẽ tọa độ lên bản đồ
            mapControl.Refresh();
        }

        #region StatusStrip
        
        public void UpdateStatusStrip(float x, float y)
        {
            PointF pScreenF = new PointF(x, y);
            //Hiển thị tọa độ Longitude, Latitude
            double lon, lat;
            lon = lat = 0;
            mapControl.ucMap1.Map.ConvertCoord(ref x, ref y, ref lon, ref lat, MapXLib.ConversionConstants.miScreenToMap);
            //toolStripStatusLabelCoordinate.Text = string.Format("K:{0} | V:{1}", GeneralClass.DecimalToDMS(lon), GeneralClass.DecimalToDMS(lat));
            //toolStripStatusLabelCoordinate2.Text = string.Format("(K:{0} | V:{1})", lon.ToString("#.####0"), lat.ToString("#.####0"));
            toolStripStatusLabelCoordinate.Text = string.Format("K:{0} | V:{1}", HTCollectionHelper.DecimalToDMS(lon), HTCollectionHelper.DecimalToDMS(lat));
            toolStripStatusLabelCoordinate2.Text = string.Format("(K:{0} | V:{1})", lon.ToString("#.####0"), lat.ToString("#.####0"));
            toolStripStatusLabelAltitude.Text = string.Format("Độ cao: {0} km", mapControl.ucMap1.Altitude.ToString("#,#"));
            toolStripStatusLabelCoord9x9.Text = string.Format("Tọa độ 9x9: {0}", _coord9x9.GetCoordinate(pScreenF));
        }
        #endregion

        #region "ToolStripMenu"

        private bool ShowCoordinate9x9 = false;
        private void tọaĐộ9x9ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ShowCoordinate9x9 = !ShowCoordinate9x9;
            if (ShowCoordinate9x9)
            {
                //string value = Properties.Settings.Default.Coord9x9;
                //_coord9x9.BigSquareArray = value.Split(new char[] { '|' });
                tọaĐộ9x9ToolStripMenuItem.Image = Properties.Resources.tick_16;
                mapControl.Refresh();

                //float x1, y1, x2, y2;
                //x1 = y1 = x2 = y2 = 0;
                ////Convert to Screen Coord
                //mapControl.ucMap1.Map.ConvertCoord(ref x1, ref y1, ref _coord9x9.NWLon, ref _coord9x9.NWLat, MapXLib.ConversionConstants.miMapToScreen);
                //mapControl.ucMap1.Map.ConvertCoord(ref x2, ref y2, ref _coord9x9.SELon, ref _coord9x9.SELat, MapXLib.ConversionConstants.miMapToScreen);
                //_coord9x9.Draw(mapControl.ucMap1.Map.CreateGraphics(), x1, y1, x2, y2, mapControl.ucMap1.Altitude);
            }
            else
            {
                tọaĐộ9x9ToolStripMenuItem.Image = null;
                mapControl.Refresh();
            }

        }

        private void địaDanhToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string layername = "TENTPHO";
            mapControl.ucMap1.Map.Layers[layername].Visible = !mapControl.ucMap1.Map.Layers[layername].Visible;
            //_objMapControl.Map.Layers["TENTPHO"].LabelProperties.Style.TextFont = ".VnArial";
            mapControl.ucMap1.Map.Layers[layername].AutoLabel = mapControl.ucMap1.Map.Layers[layername].Visible;
            if (mapControl.ucMap1.Map.Layers[layername].Visible)
                địaDanhToolStripMenuItem.Image = Properties.Resources.tick_16;
            else
                địaDanhToolStripMenuItem.Image = null;
        }

        private void biểnĐảoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string layername = "BIENDAO";
            mapControl.ucMap1.Map.Layers[layername].OverrideStyle = true;
            mapControl.ucMap1.Map.Layers[layername].Visible = !mapControl.ucMap1.Map.Layers[layername].Visible;
            //_objMapControl.Map.Layers["TENTPHO"].LabelProperties.Style.TextFont = ".VnArial";
            mapControl.ucMap1.Map.Layers[layername].AutoLabel = mapControl.ucMap1.Map.Layers[layername].Visible;
            if (mapControl.ucMap1.Map.Layers[layername].Visible)
                biểnĐảoToolStripMenuItem.Image = Properties.Resources.tick_16;
            else
                biểnĐảoToolStripMenuItem.Image = null;
        }

        #region "Airport layer"
        public void addMapXSanBay(string _layername, string _keyValue, MapXLib.Point point)
        {
            MapXLib.Feature circF = new Feature();
            MapXLib.StyleClass newstylec = new StyleClass();
            newstylec.LineColor = 255 + 125 * 256 + 256 * 256 * 0;           //r + 256*g + 256*256*b
            //newstylec.LineStyle = (PenStyleConstants)11;
            newstylec.LineWidth = 4;
            newstylec.RegionPattern = MapXLib.FillPatternConstants.miPatternNoFill;// (miPatternNoFill);
            //newstylec.RegionTransparent = true;
            newstylec.SymbolType = MapXLib.SymbolTypeConstants.miSymbolTypeTrueTypeFont;
            //newstylec.TextFont.Name = ".VnArial";
            stdole.IFontDisp _font = (stdole.IFontDisp)newstylec.SymbolFont;
            _font.Name = ".VnArial";
            newstylec.SymbolCharacter = 51;
            //_font.Size = 40;
            //newstylec.SymbolFontRotation = 360;
            newstylec.SymbolFontHalo = true;
            //newstylec.SymbolFontColor = (uint)MapXLib.ColorConstants.miColorYellow;
            //newstylec.SymbolFontBackColor = (uint)MapXLib.ColorConstants.miColorLimeGreen;

            circF = this.mapControl.ucMap1.Map.FeatureFactory.CreateCircularRegion(MapXLib.CircleTypeConstants.miCircleTypeMap, point, 500, MapXLib.MapUnitConstants.miUnitMeter, 200, newstylec);
            circF.KeyValue = _keyValue;
            this.mapControl.ucMap1.Map.Layers._Item(_layername).AddFeature(circF, new MapXLib.RowValuesClass());
        }

        /// <summary>
        /// Thêm layer mới
        /// </summary>
        /// <param name="_layerName"></param>
        /// <param name="_layerType"></param>
        public void miAddSanBayLayer(string _layerName, LAYERTYPE _layerType)
        {
            AxMapXLib.AxMap axMap1 = mapControl.ucMap1.Map;
            MapXLib.Layer lyr;
            MapXLib.LayerInfoClass lyrInfo = new MapXLib.LayerInfoClass();
            MapXLib.FieldsClass flds = new MapXLib.FieldsClass();

            flds.AddStringField("name", 50, 10);
            flds.AddStringField("lon", 50, 10);
            flds.AddStringField("lat", 50, 10);
            lyrInfo.Type = MapXLib.LayerInfoTypeConstants.miLayerInfoTypeTemp;
            lyrInfo.AddParameter("name", _layerName);
            lyrInfo.AddParameter("Fields", flds);

            lyr = axMap1.Layers.Add(lyrInfo, 1);
            lyr.Editable = true;
            axMap1.Layers.InsertionLayer = lyr;

            switch (_layerType)
            {
                case LAYERTYPE.POLYLINE:
                    break;
                case LAYERTYPE.POINT:
                    axMap1.Layers.AnimationLayer = lyr;
                    break;
            }

            this.mapControl.ucMap1.miSetStyleLabel(_layerName);
        }

        #endregion

        private void sânBayToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string layername = "SANBAY";
            mapControl.ucMap1.Map.Layers[layername].Visible = !mapControl.ucMap1.Map.Layers[layername].Visible;
            string _layerName = "airport";
            try
            {
                mapControl.ucMap1.Map.Layers.Remove(_layerName);
            }
            catch (Exception)
            {
                ;
            }
            
            if (mapControl.ucMap1.Map.Layers[layername].Visible)
            {
                sânBayToolStripMenuItem.Image = Properties.Resources.tick_16;
                miAddSanBayLayer(_layerName, LAYERTYPE.POLYON);
                DataTable db = _airPortRespository.GetAll();
                foreach (DataRow dr in db.Rows)
                {
                    string name = dr["airport_name"].ToString();
                    double lon = Convert.ToDouble(dr["longitude"]);
                    double lat = Convert.ToDouble(dr["latitude"]);

                    MapXLib.Point point = new MapXLib.PointClass();
                    //point.CreateDispatch(point.GetClsid());
                    point.Set(lon, lat);

                    //Vẽ sân bay
                    //this.mapControl.ucMap1.miAddStylePoint("airport", lon, lat, name, STYLESINGLETYPE.NORMALPOINT_RED);
                    addMapXSanBay(_layerName, name, point);
                    
                }
                this.mapControl.ucMap1.Map.Layers._Item(_layerName).AutoLabel = true;
                this.mapControl.ucMap1.Map.Layers._Item(_layerName).OverrideStyle = true;


            }
                
            else
                sânBayToolStripMenuItem.Image = null;
        }

        private void cấuHìnhCổngCOMToolStripMenuItem_Click(object sender, EventArgs e)
        {
            frmCOMSetting frm = new frmCOMSetting();
            frm.ShowDialog();
        }

        //private void mởKếtNốiToolStripMenuItem_Click(object sender, EventArgs e)
        //{
        //    ////Kết nối về CSDL chuẩn
        //    //string msg = ConnectDatabase();
        //    //if (msg != "")
        //    //{
        //    //    MessageBox.Show(msg);
        //    //    return;
        //    //}
        //    ////Mở kết nối
        //    //try
        //    //{
        //    //    GeneralClass.objPort.PortName = Properties.Settings.Default.PortName;
        //    //    GeneralClass.objPort.BaudRate = Properties.Settings.Default.BaudRate;
        //    //    GeneralClass.objPort.StopBits = Properties.Settings.Default.StopBits;
        //    //    GeneralClass.objPort.DataBits = Properties.Settings.Default.DataBits;
        //    //    GeneralClass.objPort.Parity = Properties.Settings.Default.Parity;
        //    //    GeneralClass.objPort.comPortOpen();
        //    //    toolStripStatusLabelCOMStatus.Text = string.Format("Cổng {0} đã được mở...", GeneralClass.objPort.PortName);
        //    //}
        //    //catch (Exception ex)
        //    //{
        //    //    MessageBox.Show("Xảy ra lỗi sau khi kết nối:\n" + ex.Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
        //    //}
        //}

        //private void đóngKếtNốiToolStripMenuItem_Click(object sender, EventArgs e)
        //{
        //    //đóng kết nối
        //    try
        //    {
        //        GeneralClass.objPort.comPortClose();
        //        toolStripStatusLabelCOMStatus.Text = "Cổng COM chưa mở...";

        //    }
        //    catch (Exception ex)
        //    {
        //        MessageBox.Show("Xảy ra lỗi sau khi kết nối:\n" + ex.Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
        //    }
        //}

        private void cấuHìnhTọaĐộ9x9ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            frmConfig9x9 frm = new frmConfig9x9();
            frm.ShowDialog();
            string value = Properties.Settings.Default.Coord9x9;
            _coord9x9.BigSquareArray = value.Split(new char[] { '|' });
            mapControl.ucMap1.Refresh();
        }


        private void tỉnhThànhToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string layerName = "TINH";
            mapControl.ucMap1.Map.Layers[layerName].OverrideStyle = true;
            mapControl.ucMap1.Map.Layers[layerName].Visible = !mapControl.ucMap1.Map.Layers[layerName].Visible;
            mapControl.ucMap1.Map.Layers[layerName].AutoLabel = mapControl.ucMap1.Map.Layers[layerName].Visible;
            if (mapControl.ucMap1.Map.Layers[layerName].Visible)
                tỉnhThànhToolStripMenuItem.Image = Properties.Resources.tick_16;
            else
                tỉnhThànhToolStripMenuItem.Image = null;
        }

        private void bảnĐồ1ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string layerName = "VietNam";
            mapControl.ucMap1.Map.Layers[layerName].Visible = !mapControl.ucMap1.Map.Layers[layerName].Visible;
            if (mapControl.ucMap1.Map.Layers[layerName].Visible)
                bảnĐồ1ToolStripMenuItem.Image = Properties.Resources.tick_16;
            else
                bảnĐồ1ToolStripMenuItem.Image = null;
        }

        private void bảnĐồ2ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string layerName = "AsiaMap";
            mapControl.ucMap1.Map.Layers[layerName].Visible = !mapControl.ucMap1.Map.Layers[layerName].Visible;
            if (mapControl.ucMap1.Map.Layers[layerName].Visible)
                bảnĐồ2ToolStripMenuItem.Image = Properties.Resources.tick_16;
            else
                bảnĐồ2ToolStripMenuItem.Image = null;
        }

        //Biến cho biết show/hide bảng xem lại dữ liệu
        private bool isShowReviewData = false;
        //Biến cho biết show/hide bảng tracking tọa độ gps 
        private bool isShowTrackingData = false;
        private void bảngTheoDõiToolStripMenuItem_Click(object sender, EventArgs e)
        {
            isShowTrackingData = !isShowTrackingData;
            
            if (isShowTrackingData)
            {
                ////Kết nối DB
                //string msg = GeneralClass.ConnectDatabase(GeneralClass.gpsDBFile);
                //if (msg != "")
                //{
                //    MessageBox.Show(msg);
                //    return;
                //}

                //Kết nối DB
                GeneralClass.gpsDBFile = Path.GetDirectoryName(Application.ExecutablePath) + "\\gpsdata.sdf";
                string msg = GeneralClass.ConnectDatabase(GeneralClass.gpsDBFile);
                GeneralClass.BackupDB(GeneralClass.gpsDBFile);
                if (msg != "")
                {
                    MessageBox.Show(msg);
                    return;
                }

                panelFunction.Show();
                panelFunction.Controls.Clear();
                panelFunction.Width = 503;

                isShowReviewData = false;
                xemLạiDữLiệuToolStripMenuItem.Image = null;

                splitter1.Visible = true;

                bảngTheoDõiToolStripMenuItem.Image = Properties.Resources.tick_16;

                gpsDataControl = new ucGPSData(mapControl, GeneralClass.objPort);
                gpsDataControl.OpenCOMPort_ClickEvent += new EventHandler(btnOpenCOMPort_Click);
                gpsDataControl.Dock = DockStyle.Fill;
                panelFunction.Controls.Add(gpsDataControl);
            }
            else
            {
                bảngTheoDõiToolStripMenuItem.Image = null;
                panelFunction.Hide();
            }
        }

        private void btnOpenCOMPort_Click(object sender, EventArgs e)
        {
            if (GeneralClass.objPort.IsOpen())
            {
                UpdateToolStrip(string.Format("Cổng {0} đã được mở...", GeneralClass.objPort.PortName));
            }
            else
            {
                UpdateToolStrip("Cổng COM chưa mở...");
            }
        }

        private void xemLạiDữLiệuToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //if (GeneralClass.objPort.IsOpen())
            //{
            //    MessageBox.Show("Cổng COM đang mở. Chỉ chọn xem lại file CSDL khác khi đã đóng cổng COM.");
            //    return;
            //}

            //Show/Hide tracking data
            isShowReviewData = !isShowReviewData;
            
            if (isShowReviewData)
            {
                //=========================================
                //Cho hiển thị quỹ đạo bay khi review lại dữ liệu
                isShowRoute = false;
                hiểnThịQuỹĐạoBayToolStripMenuItem.PerformClick();

                panelFunction.Show();
                panelFunction.Controls.Clear();
                panelFunction.Width = 503;

                //if show review data then hide tracking
                isShowTrackingData = false;
                bảngTheoDõiToolStripMenuItem.Image = null;

                splitter1.Visible = true;

                xemLạiDữLiệuToolStripMenuItem.Image = Properties.Resources.tick_16;

                ucReviewGPSData_Testing reviewGpsDataControl = new ucReviewGPSData_Testing(this, GeneralClass.objPort);
                reviewGpsDataControl.Dock = DockStyle.Fill;
                reviewGpsDataControl.OpenCOMPort_ClickEvent += new EventHandler(btnOpenCOMPort_Click);
                panelFunction.Controls.Add(reviewGpsDataControl);
            }
            else
            {
                xemLạiDữLiệuToolStripMenuItem.Image = null;
                panelFunction.Hide();
            }
        }

        private void hiểnThịQuỹĐạoBayToolStripMenuItem_Click(object sender, EventArgs e)
        {
            isShowRoute = !isShowRoute;
            if (isShowRoute)
            {
                hiểnThịQuỹĐạoBayToolStripMenuItem.Image = Properties.Resources.tick_16;
               
            }
            else
            {
                hiểnThịQuỹĐạoBayToolStripMenuItem.Image = null;
            }
                
            mapControl.Refresh();
        }

        private void hiểnThịTọaĐộBayToolStripMenuItem_Click(object sender, EventArgs e)
        {
            isShowGPSData = !isShowGPSData;
            if (isShowGPSData)
                hiểnThịTọaĐộBayToolStripMenuItem.Image = Properties.Resources.tick_16;
            else
                hiểnThịTọaĐộBayToolStripMenuItem.Image = null;
            mapControl.Refresh();
        }

        private bool isShowGPSInfo = true;
        public void ShowGPSInfo(bool value)
        {
            isShowGPSInfo = value;
            if (isShowGPSInfo)
            {
                hiểnThịThôngTinQuỹĐạoToolStripMenuItem.Image = Properties.Resources.tick_16;
                try
                {
                    if (frmInfo == null)
                        frmInfo = new frmGPSInfo_Testing(this);

                    frmInfo.StartPosition = FormStartPosition.Manual;
                    frmInfo.Location = new Point(this.ClientSize.Width - frmInfo.Width - 10, this.ClientSize.Height - frmInfo.Height - 10);
                    frmInfo.Show();
                }
                catch
                {
                    frmInfo = new frmGPSInfo_Testing(this);
                    frmInfo.StartPosition = FormStartPosition.Manual;
                    frmInfo.Location = new Point(this.ClientSize.Width - frmInfo.Width - 10, this.ClientSize.Height - frmInfo.Height - 10);
                    frmInfo.Show();
                }

                //hiểnThịTọaĐộBayToolStripMenuItem.Text = "Ẩn tọa độ bay";
            }
            else
            {
                hiểnThịThôngTinQuỹĐạoToolStripMenuItem.Image = null;
                //Point p = frmInfo.Location;
                try
                {
                    frmInfo.Hide();
                }
                catch
                {
                    frmInfo = null;
                }

                //hiểnThịTọaĐộBayToolStripMenuItem.Text = "Hiển thị tọa độ bay";
            }
            mapControl.Refresh();
        }

        private void hiểnThịThôngTinQuỹĐạoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            isShowGPSInfo = !isShowGPSInfo;
            ShowGPSInfo(isShowGPSInfo);
        }

        #endregion

        private bool isOptimize = false;
        private void hiểnThịTốiƯuTốcĐộToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Chức năng này chưa cập nhật");
            return;
            isOptimize = !isOptimize;
            //isOptimize = false;
            if (isOptimize)
            {
                hiểnThịTốiƯuTốcĐộToolStripMenuItem.Image = Properties.Resources.tick_16;
                //hiểnThịTọaĐộBayToolStripMenuItem.Text = "Ẩn tọa độ bay";
            }
            else
            {
                hiểnThịTốiƯuTốcĐộToolStripMenuItem.Image = null;
                //hiểnThịTọaĐộBayToolStripMenuItem.Text = "Hiển thị tọa độ bay";
            }
            mapControl.Refresh();
        }

        private void nốiDữLiệuToolStripMenuItem_Click(object sender, EventArgs e)
        {
            frmConcatData frm = new frmConcatData();
            frm.ShowDialog();
        }

       
    }
}